home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
et
/
et3_0-a1.lha
/
et3
/
src
/
CONTAINER
/
ObjList.h
< prev
next >
Wrap
C/C++ Source or Header
|
1992-06-11
|
3KB
|
129 lines
#ifndef ObjList_First
#ifdef __GNUG__
//pragma once
#pragma interface
#endif
#define ObjList_First
#include "SeqColl.h"
//---- ObjLink -----------------------------------------------------------------
class ObjLink: public Object {
friend class ObjList;
friend class ObjListIter;
friend class RevObjListIter;
protected:
ObjLink()
{ op= 0; next= this; prev= this; }
public:
MetaDef(ObjLink);
ObjLink(Object *a, ObjLink *ll);
void FreeAll();
Object *Op()
{ return op; }
ObjLink *Next()
{ return next; }
ObjLink *Prev()
{ return prev; }
//---- memory allocation
void *operator new(size_t sz)
{ return Storage::ObjectChunkAlloc(sz); }
void operator delete(void *vp)
{ Storage::ObjectChunkFree(vp); }
private:
ObjLink *next, *prev;
Object *op;
};
//---- ObjList -----------------------------------------------------------------
class ObjList: public SeqCollection {
friend class ObjListIter;
friend class RevObjListIter;
public:
MetaDef(ObjList);
ObjList();
~ObjList();
void InitNew();
void Empty(int);
void FreeAll();
//---- manipulation
Object *Add(Object *op);
Object *AddAt(Object *op, int idx);
Object *AddBefore(Object *op, Object *after);
Object *AddBeforePtr(Object *op, Object *after);
Object *AddAfter(Object *op, Object *before);
Object *AddAfterPtr(Object *op, Object *before);
Object *PutAt(Object *op, int idx);
Object *Remove(Object *op);
Object *RemovePtr(Object *op);
Object *RemoveLast();
Object *RemoveAt(int i);
//---- accessing
Iterator *MakeIterator(bool dir= cIterForward);
Object *At(int i);
Object *Before(Object *after);
Object *BeforePtr(Object *after);
Object *After(Object *before);
Object *AfterPtr(Object *before);
Object *First();
Object *Last();
Object *Find(Object *op);
Object *FindPtr(Object *op);
protected:
//---- primitives
ObjLink *FindLink(Object *op, bool eq);
Object *DoInsertBefore(Object *before, Object *op, bool eq, char *name);
Object *DoInsertAfter(Object *after, Object *op, bool eq, char *name);
ObjLink *DoMakeLink(Object *op, ObjLink *ll);
ObjLink *LinkAt(int i);
void InsertLink(Object *op, ObjLink *ll);
void RemoveLink(ObjLink *ll);
protected:
ObjLink *anchor;
};
//---- class ObjListIter ------------------------------------------------------
class ObjListIter: public Iterator {
friend class ObjList; // due to ATT 2.0, 2.1 for passing a IteratorMethod
public:
ObjListIter(ObjList *s);
~ObjListIter();
Object* operator()();
void Reset();
protected:
Container *GetContainer();
void AboutToEmpty(void *pix);
void AboutToAdd(void *pix);
void AboutToRemove(void *pix);
protected:
ObjList *list;
ObjLink *ce; // current element
};
//---- class RevObjListIter ---------------------------------------------------
class RevObjListIter: public ObjListIter {
public:
RevObjListIter(ObjList *s);
Object* operator()();
protected:
void AboutToRemove(void *pix);
};
//-----------------------------------------------------------------------------
#endif ObjList